/*
* 剪枝方法
* 1.优化搜索顺序：优先枚举较大的数
* 2.排除等效冗余：
* 3.可行性剪枝:不符合规则，直接剪枝
* 4.最优化剪枝：不是最优解，直接剪枝
* 5.记忆化搜索：DP
*/

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
// #define ONLINE_GUDGE
const int N = 110;

int n;
int path[N];

bool dfs(int u, int depth)
{
    if(u > depth) return false;
    if(path[u-1] == n) return true; // 找到合法解

    bool st[N] = {0};
    for(int i = u-1; i >= 0; i--)
        for(int j = i; j>=0; j--)
        {
            int s = path[i] + path[j];
            if(s > n || s <= path[u-1] || st[u]) continue; // 剪枝

            st[i] = true;
            path[u] = s;
            if(dfs(u + 1, depth)) return true;
        }
        return false;

}

int main()
{

    #ifdef ONLINE_GUDGE

    #else
        freopen("./in.txt", "r", stdin);
    #endif
    ios::sync_with_stdio(0); cin.tie(0);
    path[0] = 1;
    while(cin >> n, n)
    {
        int depth = 1;
        while(!dfs(1, depth)) depth++;
        for(int i = 0; i < depth; i++) cout << path[i] << ' ';
        cout << endl;
    }
    return 0;
}